Unique Constraint VS Unique Index
TLDR
- Unique Constraint 與 Unique Index 在資料唯一性驗證與查詢效能上功能完全相同。
- 建立 Unique Constraint 時,SQL Server 會自動在背景建立一個對應的 Unique Index。
- 兩者主要差異在於「語意」:Unique Constraint 強調資料完整性(Data Integrity),而 Unique Index 強調查詢效能。
- 建議優先使用 Unique Constraint,因為它能讓資料庫的設計意圖更明確。
- Foreign Key 關聯的目標欄位必須具備唯一性,無論是透過 Constraint 還是 Index 達成皆可。
命名規範與技術背景
在 SQL Server 中,為了維護資料庫結構的清晰度,建議遵循以下命名慣例:
- Primary Key:
PK_TableName - Clustered Index:
CX_TableName_Column1_Column2 - Non-Clustered Index:
IX_TableName_Column1_Column2 - Unique Index (Alternate Key):
AK_TableName_Column1_Column2 - Unique Constraint:
UQ_TableName_Column1_Column2 - Check Constraint:
CK_TableName_Column1_Column2 - Default Constraint:
DF_TableName_Column1_Column2 - Foreign Key:
FK_TableName1_Column1_Column2_TableName2
Unique Constraint 與 Unique Index 的差異
什麼情況下會遇到這個問題
當開發者在設計資料表結構時,面臨「該使用 Unique Constraint 還是 Unique Index 來確保欄位唯一性」的選擇困難時。
原因分析
從 SQL Server 的執行層面來看,兩者並無明顯差異。資料驗證機制相同,且查詢最佳化工具(Query Optimizer)不會區分該索引是由 Constraint 建立還是手動建立。
主要的差異在於語意明確性:
- Unique Constraint:屬於資料完整性的一部分,明確表達該欄位在業務邏輯上必須是唯一的。
- Unique Index:屬於效能調校的一部分,主要目的是為了加速查詢,同時具備強制唯一性的副作用。
驗證結果
在 Foreign Key 的關聯上,無論目標欄位是透過 Unique Constraint 還是 Unique Index 建立,SQL Server 均能正確識別並建立關聯。
sql
-- 建立包含 Unique Constraint 的資料表
CREATE TABLE [dbo].[Main](
[Id] [uniqueidentifier] NOT NULL,
[SeqNo] [bigint] IDENTITY(1,1) NOT NULL,
[UQ] [bigint] NULL,
[AK] [bigint] NULL,
CONSTRAINT [PK_Main] PRIMARY KEY NONCLUSTERED ([Id] ASC),
CONSTRAINT [UQ_Main] UNIQUE NONCLUSTERED ([UQ] ASC)
) ON [PRIMARY]
GO
-- 建立關聯的 Foreign Key
ALTER TABLE [dbo].[Ref] ADD CONSTRAINT [FK_Ref_Main_UQ] FOREIGN KEY([RefUQ])
REFERENCES [dbo].[Main] ([UQ])
GO建立方式與管理
使用 SQL 建立
若需透過指令建立,可參考以下語法:
sql
-- 建立 Unique Constraint
ALTER TABLE {TableName} ADD CONSTRAINT {IndexName} UNIQUE ({ColumnName});
-- 建立 Unique Index
CREATE UNIQUE INDEX {IndexName} ON {TableName} ({ColumnName});使用 SSMS 建立
在 SQL Server Management Studio (SSMS) 中,兩者的管理位置不同:
- Unique Constraint:位於資料表設計介面的「索引/索引鍵」中,型別選「唯一索引鍵」。
- Unique Index:若透過資料表設計介面,型別選「索引」並將「是唯一」設為「是」;或直接在「索引」資料夾中新增。
TIP
若開啟了資料表設計視窗,該資料表的「新增索引」選項會呈現反灰,此時應透過設計視窗內的「索引/索引鍵」進行管理。
SSMS 顯示差異
- 「索引鍵」資料夾:顯示 Primary Key、Unique Constraint 與 Foreign Key。
- 「索引」資料夾:顯示除了 Foreign Key 以外的所有索引。
異動歷程
- 初版文件建立。